class NguoiDung
  include MongoMapper::Document

  #attr_accessible :ten_hien_thi, :email, :mat_khau, :mat_khau_confirmation, :ngon_ngu, :ngay_sinh, :so_dien_thoai, :dia_chi, :vai_tros

  before_save :ma_hoa_mat_khau

  key   :ten_hien_thi,        String,     :presence => true,   :length => {:minimum => 4, :maximum => 40}
  key   :email,               String,     :presence => true,   :uniqueness => true,     :length => {:minimum => 5}
  key   :mat_khau_hash,       String
  key   :mat_khau_moi_token,  String
  key   :ngon_ngu,            String
  key   :dia_chi,             String
  key   :so_dien_thoai,       String
  key   :ngay_sinh,           Time
  key   :is_admin,            Boolean
  key   :is_xu_ly_don_hang,   Boolean
  key   :is_nhan_vien,        Boolean
  key   :dang_kich_hoat,      Boolean
  key     :gioi_tinh,           Integer

  timestamps!

  # validates_confirmation_of :mat_khau
  # validates_length_of       :mat_khau,  :minimum => 6, :allow_nil => true, :on => :create
  # validates_presence_of     :mat_khau,  :on => :create
  validates :email, :'validators/email' => true
  def ma_hoa_mat_khau
    if self.dang_kich_hoat.nil?
    self.dang_kich_hoat = true;
    end
    if self.is_admin.nil?
    self.is_admin = false;
    end
    if self.is_nhan_vien.nil?
    self.is_nhan_vien = false;
    end
    # if mat_khau.present?
      # self.mat_khau_hash = Digest::SHA1.hexdigest(mat_khau)
      # if self.mat_khau_confirmation.present? && self.mat_khau_confirmation == self.mat_khau
        # self.mat_khau_confirmation = "x" * 6
      # end
      # self.mat_khau = "x" * 6
    # end
    # if !mat_khau_confirmation.present?
      # mat_khau_confirmation = "x"
    # end
  end
  
  def tuoi
    if (self.ngay_sinh.present?)
      now = Time.now.utc.to_date
      return now.year - self.ngay_sinh.year - ((now.month > self.ngay_sinh.month || (now.month == self.ngay_sinh.month && now.day >= self.ngay_sinh.day)) ? 0 : 1)
    end
  end

  def kiem_tra_mat_khau(mat_khau)
    return self.mat_khau_hash == Digest::SHA1.hexdigest(mat_khau)
  end
  
  def mat_khau_moi(mat_khau)
    self.mat_khau_hash = Digest::SHA1.hexdigest(mat_khau)
    self.save
    return self
  end
  
  def is_ho_so_hoan_chinh?
    self.ngay_sinh.present? && !self.gioi_tinh.nil? && self.gioi_tinh >= 0
  end

  # Kiểm tra thông tin đăng nhập của một người dùng có hợp lệ không,
  # nếu hợp lệ sẽ trả về người dùng được tìm thấy, ngược lại sẽ trả
  # về +nil+
  #
  # * *Args*  :
  #   - +email+     ->    email của người dùng
  #   - +mat_khau+  ->    mật khẩu (dạng chưa được mã hóa)
  # * *Return* :
  #   - Nếu tìm thấy người dùng có thông tin này thì trả về người
  # dùng đó, ngược lại trả về +nil+
  def self.kiem_tra_dang_nhap(email, mat_khau)
    nguoi_dung = find_by_email(email)
    if nguoi_dung && nguoi_dung.mat_khau_hash == Digest::SHA1.hexdigest(mat_khau)
    nguoi_dung
    else
      nil
    end
  end

  def self.quen_mat_khau(email, hostname)
    nguoi_dung = find_by_email(email)
    if nguoi_dung.present?
      nguoi_dung.mat_khau_moi_token = Digest::SHA1.hexdigest(nguoi_dung.email + Time.now.to_s)
      if nguoi_dung.save
        mailer = NguoiDungMailer.tao_mat_khau_moi_email(nguoi_dung, hostname).deliver
        if mailer.present?
        return nguoi_dung
        end
      end
    end
    return nil
  end

  def self.tao_mat_khau_moi(token, mat_khau, mat_khau_confirmation)
    nguoi_dung = find_by_mat_khau_moi_token(token)
    if nguoi_dung.present?
      if mat_khau_confirmation != mat_khau
        return false
      end
      # nguoi_dung.mat_khau = mat_khau
      # nguoi_dung.mat_khau_confirmation = mat_khau_confirmation
      nguoi_dung.mat_khau_hash = Digest::SHA1.hexdigest(mat_khau)
      nguoi_dung.mat_khau_moi_token = nil
    return nguoi_dung.save
    end
    return false
  end

  def co_quyen_quan_ly
    self.is_admin || self.is_quan_ly_bai_viet || self.is_xu_ly_don_hang
  end
end